#include "groupchatwindow.h"
#include "ui_groupchatwindow.h"
#include "groupmemberitem.h"
#include "groupfileitem.h"
#include "groupnoticeitem.h"
#include "mytcpsocket.h"

#include <QFile>
#include <QFileDialog>
#include <QMessageBox>

GroupChatWindow::GroupChatWindow(struct st_personData user,struct st_gData gdata,QWidget *parent) :
    QWidget(parent),
    ui(new Ui::GroupChatWindow)
{
    ui->setupUi(this);
    // 窗口渲染
    setQssStyle(QString("../style/GroupChatWindowStyle.qss"),this);

    this->setWindowFlags(Qt::CustomizeWindowHint | Qt::WindowCloseButtonHint);
    this->setMinimumSize(705,544);

    m_user = user;
    m_group = gdata;

    ui->btn_history->setToolTip("查看历史聊天记录");
    ui->btn_joy->setToolTip("发送表情");
    ui->btn_uploadfile->setToolTip("上传群文件");
    ui->btn_gnotice->setToolTip("发布群公告");
    // 只有群主才有此功能,群员没有
    if(m_user.dd_num != m_group.gboss){
        ui->btn_gnotice->setVisible(false);
    }

    int borderWidth = 15; // 边框的宽度
    cv::Scalar borderColor(0, 0, 0, 255);
    QString uUrl = QString("%1/%2.png").arg(PATH_IMG).arg(m_user.dd_num);
    user_head = RoundBorderPixmap(downLoadFromUrl(uUrl),borderWidth,borderColor);

    // 隐藏滚动条
    // 聊天窗口
    ui->listWidget_O->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); //垂直滚动条
    ui->listWidget_O->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); //水平滚动条
    // 成员列表
    ui->lw_gmember->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); //垂直滚动条
    ui->lw_gmember->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); //水平滚动条
    // 群文件
    ui->lw_gfile->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); //垂直滚动条
    ui->lw_gfile->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); //水平滚动条
    // 群通知
    ui->lw_gnotice->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); //垂直滚动条
    ui->lw_gnotice->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); //水平滚动条
    // 设置不可选中
//    ui->listWidget_O->setSelectionMode(QListWidget::NoSelection);

    // 成员列表添加间距
    ui->lw_gmember->setSpacing(2);

    // 设置图标
    this->setWindowTitle(m_group.gname);
    QString gUrl = QString("%1/%2.png").arg(PATH_IMG).arg(gdata.gid);
    QPixmap gicon = PixmapToRoundOpenCV(downLoadFromUrl(gUrl));
    this->setWindowIcon(QIcon(gicon));
    // 表情窗口
    qqfaceWindow = new MyQQFaceWindow(m_user,m_group);
    // 发布群公告
    gnoticeWindow = new AddGroupNotice(m_group.gid);

    connect(this,SIGNAL(sig_addGroupFile(QVariant)),this,SLOT(slot_addGroupFile(QVariant)));
    connect(this,SIGNAL(sig_addGroupNotice(QVariant)),this,SLOT(slot_addGroupNotice(QVariant)));
    connect(this,SIGNAL(sig_addGroupMember(QVariant)),this,SLOT(slot_addGroupMember(QVariant)));
    connect(this,SIGNAL(sig_deleteGroupMember(QVariant)),this,SLOT(slot_deleteGroupMember(QVariant)));

    // 绑定回车 发送按钮
    connect(ui->te_input,&CustomTextEdit::sendButtonPressed,ui->btn_send,&QPushButton::click);

}

GroupChatWindow::~GroupChatWindow()
{
    delete ui;
}


void GroupChatWindow::addTextRecord(st_msg msg)
{
    QListWidgetItem* item = new QListWidgetItem(ui->listWidget_O);  // 创建一个QListWidgetItem
    item->setSizeHint(QSize(ui->listWidget_O->width(),row_H));  // 设置大小(主要是行高)
    ui->listWidget_O->addItem(item);    // 加入ListWidget中
    MyListWidgetItem* myitem;
    // 自己发的,头像、气泡在右部
    if(msg.send == GlobalObject::getGlobalObject()->getUserInfo().sdata.dd_num){
        myitem = new MyListWidgetItem(msg.contect, R_USER,user_head,msg.type,ui->listWidget_O->parentWidget());
    }
    // 好友发的,头像、气泡在左部
    else{
        QString furl = QString("%1/%2.png").arg(PATH_IMG).arg(msg.send);
        int borderWidth = 15; // 边框的宽度
        cv::Scalar borderColor(0, 0, 0, 255);
        friend_head = RoundBorderPixmap(downLoadFromUrl(furl),borderWidth,borderColor);
        myitem = new MyListWidgetItem(msg.contect, R_FRIEND,friend_head,msg.type,ui->listWidget_O->parentWidget());
    }
    myitem->seq = autoSeq++;  // 记录下位置
    ui->listWidget_O->setItemWidget(item,myitem);   // 用自定义Widget填充刚才创建的ListWidgetItem
    // 文本宽度超出最大限制,更新QListWidgetItem的高度
    connect(myitem,SIGNAL(sig_rectChange(QSize,int)),this,SLOT(updateItemSize(QSize,int)));

    // 滚动到底部
    ui->listWidget_O->scrollToBottom();
}

void GroupChatWindow::addJoyRecord(st_msg msg)
{
    QListWidgetItem* item = new QListWidgetItem(ui->listWidget_O);  // 创建一个QListWidgetItem
    item->setSizeHint(QSize(ui->listWidget_O->width(),row_H));  // 设置大小(主要是行高)
    ui->listWidget_O->addItem(item);    // 加入ListWidget中
    MyListWidgetItem* myitem;
    // 自己发的
    if(msg.send == GlobalObject::getGlobalObject()->getUserInfo().sdata.dd_num){
        myitem = new MyListWidgetItem(msg.contect, R_USER,user_head,msg.type,ui->listWidget_O->parentWidget());
    }
    // 好友发的
    else{
        QString furl = QString("%1/%2.png").arg(PATH_IMG).arg(msg.send);
        friend_head = PixmapToRoundOpenCV(downLoadFromUrl(furl));
        myitem = new MyListWidgetItem(msg.contect, R_FRIEND,friend_head,msg.type,ui->listWidget_O->parentWidget());
    }
    myitem->seq = autoSeq++;  //记录下位置
    ui->listWidget_O->setItemWidget(item,myitem);   //用自定义Widget填充刚才创建的ListWidgetItem
    // 文本宽度超出最大限制,更新QListWidgetItem的高度
    connect(myitem,SIGNAL(sig_rectChange(QSize,int)),this,SLOT(updateItemSize(QSize,int)));

    // 滚动到底部
    ui->listWidget_O->scrollToBottom();
}

void GroupChatWindow::addNewGroupMemberRecord(st_gMemberData gdata)
{
    QListWidgetItem* item = new QListWidgetItem(ui->listWidget_O);  // 创建一个QListWidgetItem
    item->setSizeHint(QSize(ui->listWidget_O->width(),row_H));  // 设置大小(主要是行高)
    ui->listWidget_O->addItem(item);    // 加入ListWidget中
    MyListWidgetItem* myitem;

    myitem = new MyListWidgetItem(gdata.nick, R_NOTICE,QPixmap(),56,ui->listWidget_O->parentWidget());

    myitem->seq = autoSeq++;  //记录下位置
    ui->listWidget_O->setItemWidget(item,myitem);   //用自定义Widget填充刚才创建的ListWidgetItem
    // 文本宽度超出最大限制,更新QListWidgetItem的高度  这种通知不可能超出高度的
//    connect(myitem,SIGNAL(sig_rectChange(QSize,int)),this,SLOT(updateItemSize(QSize,int)));

    // 滚动到底部
    ui->listWidget_O->scrollToBottom();
}

void GroupChatWindow::addGroupMemberQuitRecord(st_gMemberData gdata)
{
    QListWidgetItem* item = new QListWidgetItem(ui->listWidget_O);  // 创建一个QListWidgetItem
    item->setSizeHint(QSize(ui->listWidget_O->width(),row_H));  // 设置大小(主要是行高)
    ui->listWidget_O->addItem(item);    // 加入ListWidget中
    MyListWidgetItem* myitem;

    myitem = new MyListWidgetItem(gdata.nick, R_NOTICE,QPixmap(),57,ui->listWidget_O->parentWidget());

    myitem->seq = autoSeq++;  //记录下位置
    ui->listWidget_O->setItemWidget(item,myitem);   //用自定义Widget填充刚才创建的ListWidgetItem
    // 文本宽度超出最大限制,更新QListWidgetItem的高度  这种通知不可能超出高度的
//    connect(myitem,SIGNAL(sig_rectChange(QSize,int)),this,SLOT(updateItemSize(QSize,int)));

    // 滚动到底部
    ui->listWidget_O->scrollToBottom();
}

void GroupChatWindow::Show()
{
    // 如果是第一次打开, 让服务器准备好 群文件、群公告、群成员,提醒我们拉取
    if(openNum == 1){

        QVariantMap map;
        map["cmd"] = "get_groupfile";
        map["gid"] = m_group.gid;

        //发送请求
        GlobalObject::getGlobalObject()->sendRequest(map);

        ++openNum;


    }
    show();
}

void GroupChatWindow::closeEvent(QCloseEvent *event)
{
    // 因为表情窗口没有父对象,所以关闭私聊窗口时也关闭表情窗口
    qqfaceWindow->hide();
}

void GroupChatWindow::on_btn_send_clicked()
{
    // 获取用户输入的文本
    QString text = ui->te_input->toPlainText();
    ui->te_input->clear();
    // 封装数据报文
    QVariantMap map;
    map["cmd"]="group_chat";
    map["send"] = m_user.dd_num;
    map["recv"] = m_group.gid;
    map["type"] = 54;   //消息类型 群聊文字
    map["content"] = text;

    // 发送数据报文
    GlobalObject::getGlobalObject()->sendRequest(map);
}

void GroupChatWindow::updateItemSize(QSize size, int index)
{
    //更新对应Item的高
    ui->listWidget_O->item(index)->setSizeHint(size);
    update();
}

void GroupChatWindow::slot_addGroupFile(QVariant var)
{
    struct st_file file = var.value< struct st_file>();
    QListWidgetItem* item = new QListWidgetItem(ui->lw_gfile);  //创建一个QListWidgetItem
    item->setSizeHint(QSize(ui->lw_gfile->width(),40));  //设置大小(主要是行高)
    ui->lw_gfile->addItem(item);    //加入ListWidget中
    GroupFileItem* myitem = new GroupFileItem(file,this);

    ui->lw_gfile->setItemWidget(item,myitem);   //用自定义Widget填充刚才创建的ListWidgetItem
}

void GroupChatWindow::slot_addGroupNotice(QVariant var)
{
    struct st_gNotice gnotice = var.value< struct st_gNotice>();
    QListWidgetItem* item = new QListWidgetItem(ui->lw_gnotice);  //创建一个QListWidgetItem
    item->setSizeHint(QSize(ui->lw_gnotice->width(),40));  //设置大小(主要是行高)
    ui->lw_gnotice->addItem(item);    //加入ListWidget中
    GroupNoticeItem* myitem = new GroupNoticeItem(gnotice,this);

    ui->lw_gnotice->setItemWidget(item,myitem);   //用自定义Widget填充刚才创建的ListWidgetItem
}

void GroupChatWindow::slot_addGroupMember(QVariant var)
{
    struct st_gMemberData gmember = var.value< struct st_gMemberData>();
    QListWidgetItem* item = new QListWidgetItem(ui->lw_gmember);  //创建一个QListWidgetItem
    item->setSizeHint(QSize(ui->lw_gmember->width(),40));  //设置大小(主要是行高)
    item->setData(Qt::UserRole,QVariant(gmember.mid));  // 设置属性,方便删除
    ui->lw_gmember->addItem(item);
    GroupMemberItem* myitem = new GroupMemberItem(gmember,this);

    // 判断是否是自己
    int uid = GlobalObject::getGlobalObject()->getUserInfo().sdata.dd_num;
    if(gmember.mid == uid)
        myitem->setMe(true);
    else
        myitem->setMe(false);

     // 判断是否是群主
    int boss = m_group.gboss;
    if(gmember.mid == boss)
        myitem->setBoss(true);
    else
        myitem->setBoss(false);

     ui->lw_gmember->setItemWidget(item,myitem);

}

void GroupChatWindow::slot_deleteGroupMember(QVariant var)
{
    struct st_gMemberData gmember = var.value< struct st_gMemberData>();
    int count = ui->lw_gmember->count();
    for(int i = 0;i<count;i++){
        QListWidgetItem* item = ui->lw_gmember->item(i);
        if(item->data(Qt::UserRole) == gmember.mid){
            delete item;
            break;
        }
    }

}


void GroupChatWindow::on_btn_joy_clicked()
{
    if(ui->btn_joy->isChecked() == true){
        // 获取控件相对于全局的坐标
        int x = ui->btn_joy->mapToGlobal(QPoint(0,0)).x();
        int y = ui->btn_joy->mapToGlobal(QPoint(0,0)).y();
        int h = qqfaceWindow->height();
        qqfaceWindow->move(QPoint(x,y-h));
        qqfaceWindow->raise();
        qqfaceWindow->show();
    }else{
        qqfaceWindow->hide();
    }
}


void GroupChatWindow::on_btn_uploadfile_clicked()
{
    QString path = QFileDialog::getOpenFileName(this,tr("选择一个文件"),"../test/","*.txt *.docx *.doc *.pdf");
    GlobalObject::getGlobalObject()->setSendfilePath(path);
    if(GlobalObject::getGlobalObject()->getSendfilePath().isNull())
        return;
    //获取文件信息
    QFileInfo fileinfo(GlobalObject::getGlobalObject()->getSendfilePath());
    //文件名(带有后缀)
    QString fname = fileinfo.fileName();
    //文件大小(KB)
    qint64 fsize = fileinfo.size();

    GlobalObject::getGlobalObject()->setCurrentSendFileGid(m_group.gid);

    QVariantMap map;
    map["cmd"] = "file_head";
    map["filename"] = fname;
    map["filesize"] = fsize;

    //发送文件头
    GlobalObject::getGlobalObject()->sendRequest(map);
    // 上传群文件
    GlobalObject::getGlobalObject()->setUpload_file_flag(2);
}


void GroupChatWindow::on_btn_history_clicked()
{
    if(historyMsgNum == 0){
        //封装报文
        QVariantMap map;
        map["cmd"]="get_history_msg_group";
        map["uid"] = m_user.dd_num;
        map["gid"] = m_group.gid;

        //发送报文
        GlobalObject::getGlobalObject()->sendRequest(map);

        historyMsgNum++;
    }else {
        QMessageBox::information(this,"消息漫游","历史消息记录已经漫游");
    }
}


void GroupChatWindow::on_btn_gnotice_clicked()
{
    gnoticeWindow->show();
}

